package xyz.fivefaith.cloud.common.mybatis.core.page;

import cn.hutool.core.collection.CollUtil;

import com.baomidou.mybatisplus.core.metadata.IPage;

import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serial;
import java.io.Serializable;
import java.util.List;
import xyz.fivefaith.tool.common.domain.enums.ResultCode;

/**
 * 表格分页数据对象
 *
 * @author Lion Li
 */
@Data
@NoArgsConstructor
public class TableDataInfo<T> implements Serializable {

    @Serial private static final long serialVersionUID = 1L;

    /** 总记录数 */
    private long total;

    /** 列表数据 */
    private List<T> rows;

    /** 消息状态码 */
    private int code;

    /** 消息内容 */
    private String msg;

    /**
     * 分页
     *
     * @param list 列表数据
     * @param total 总记录数
     */
    public TableDataInfo(List<T> list, long total) {
        this.rows = list;
        this.total = total;
    }

    /** 根据分页对象构建表格分页数据对象 */
    public static <T> TableDataInfo<T> build(IPage<T> page) {
        TableDataInfo<T> rspData = new TableDataInfo<>();
        rspData.setCode(ResultCode.SUCCESS.getCode());
        rspData.setMsg("查询成功");
        rspData.setRows(page.getRecords());
        rspData.setTotal(page.getTotal());
        return rspData;
    }

    /** 根据数据列表构建表格分页数据对象 */
    public static <T> TableDataInfo<T> build(List<T> list) {
        TableDataInfo<T> rspData = new TableDataInfo<>();
        rspData.setCode(ResultCode.SUCCESS.getCode());
        rspData.setMsg("查询成功");
        rspData.setRows(list);
        rspData.setTotal(list.size());
        return rspData;
    }

    /** 构建表格分页数据对象 */
    public static <T> TableDataInfo<T> build() {
        TableDataInfo<T> rspData = new TableDataInfo<>();
        rspData.setCode(ResultCode.SUCCESS.getCode());
        rspData.setMsg("查询成功");
        return rspData;
    }

    /**
     * 根据原始数据列表和分页参数，构建表格分页数据对象（用于假分页）
     *
     * @param list 原始数据列表（全部数据）
     * @param page 分页参数对象（包含当前页码、每页大小等）
     * @return 构造好的分页结果 TableDataInfo<T>
     */
    public static <T> TableDataInfo<T> build(List<T> list, IPage<T> page) {
        if (CollUtil.isEmpty(list)) {
            return TableDataInfo.build();
        }
        List<T> pageList = CollUtil.page((int) page.getCurrent() - 1, (int) page.getSize(), list);
        return new TableDataInfo<>(pageList, list.size());
    }
}
